package Bank;

/*
* File:    ThreadBanco.java
* Coms:    Hilo lanzado por el Banco para gestionar la creación de cuentas
* 		   o realizar pagos a un servidor.
*/

/**
 * @author Daniel Cabrera Ebana - 686013
 * @author Alberto Sanchez Romero - 662385
 * @since 
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ThreadBanco implements Runnable{

	private Socket clientSocket;
	private GestorCuentas monitorCuentas;
	private PrintWriter salHaciaCliente = null;
	private BufferedReader entDesdeCliente = null;
	
	/**
	 * Constructor de la clase
	 * @param clientSocket
	 * @param monitorCuentas
	 */
	public ThreadBanco(Socket clientSocket, GestorCuentas monitorCuentas){
		this.clientSocket = clientSocket;
		this.monitorCuentas = monitorCuentas;
		
		try{
			salHaciaCliente = new PrintWriter(clientSocket.getOutputStream(), true);
			entDesdeCliente = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
		}catch(IOException e){
			System.err.println(e);
   			System.exit(-1);
		}
	}
	
	public void run(){
		
		try {
			String input = entDesdeCliente.readLine();
			System.out.println(input);
			if(input.equals("crear cuenta")){
				//Lanza la función para crear una nueva cuenta
				System.out.println("---Gestionando la creación de una nueva cuenta---");
				gestionarConCliente();
			}else{	
				//lanza la gestión de cuentas
				System.out.println("---Gestionando las peticiones de cobro del servidor---");
				gestionarConServidor(input);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	/**
	 * Gestionar con un cliente la creacion de una nueva cuenta
	 * @see Cliente.java
	 */
	private void gestionarConCliente(){
		
		try{
			//Recibir el saldo que se quiere añadir a la cuenta
			String saldo = entDesdeCliente.readLine();
			//Generar una nueva VISA
			String VISA = monitorCuentas.generarVisa();
			//Creando el nuevo cliente en el banco
			monitorCuentas.addCliente(VISA, Integer.parseInt(saldo));
			System.out.println("Nueva cliente añadido");
			//Envia al cliente su nueva VISA(puede contener el número de VISA o
			//un código de error que gestiona en cliente
			salHaciaCliente.println(VISA);
			//Cerrar conexion con cliente
			salHaciaCliente.close();
			System.out.println("Cliente termina sesion");
			
		} catch(IOException e) {
			System.err.println(e);
	   		System.exit(-1);
		}
	}
	
	/**
	 * Gestiona las consultas y/o cobros realizados por un cliente externo
	 * @param visacobro número de visa al que realizarle el cobro(VISA,precio)
	 * @see ThreadServidor.java
	 */
	private void gestionarConServidor(String visacobro){
	
		try{
			//separo el numero de visa del precio
			String VISA = visacobro.substring(0, visacobro.indexOf(","));
			String cobro = visacobro.substring(visacobro.indexOf(",")+1);
			//compruba la VISA y el saldo y lo envia
			String respuestaBanco = monitorCuentas.comprobarVisaSaldo(VISA, Integer.parseInt(cobro));
			salHaciaCliente.println(respuestaBanco);
			if(respuestaBanco.equals("1")){	//Si la respuesta es positiva 
				try {
					//espera la confirmación del pago
					String decidirPagar = entDesdeCliente.readLine();
					if(decidirPagar.equals("pagar")){
						//Realizar pago
						monitorCuentas.restarSaldo(VISA, Integer.parseInt(cobro));
						//Avisar de que el pago se ha realizado
						salHaciaCliente.println("ok");
					}
				} catch (IOException e) {
					e.printStackTrace();
					salHaciaCliente.println("error");
				}
			}
			//Cerrar conexion con cliente
			salHaciaCliente.close();
			System.out.println("Cliente<ThreadServidor> termina sesion");
			
		} catch(NumberFormatException e) {
			System.err.println(e);
	   		System.exit(-1);
		}
	}
	
}
